'''
author:1900
@time:2022/06/01
'''


import os
import tkinter as tk
from tkinter import messagebox
import time
import win32file
import win32con
import win32api
import threading  # 导入多线程模块
from tkinter.scrolledtext import ScrolledText
# 获取时间
def get_time():
    ft = time.strftime("%Y-%m-%d %H:%M:%S  ", time.localtime()) # 时间格式
    return ft

event = threading.Event()
class GUI:

    def __init__(self):
        self.root = tk.Tk()
        self.root.title('检测U盘并隐藏指定文件')
        self.root.geometry("500x450+550+250") # 长x宽+x*y
        self.interface()

    def interface(self):
        """"界面编写位置"""
        # 文本框
        self.Label0 = tk.Label(self.root, text="请指定您要隐藏的文件:")
        self.Label0.place(x=100, y=30, width=130, height=30)
        # 输入框
        self.Entry0 = tk.Entry(self.root)
        self.Entry0.place(x=250, y=30, width=130, height=30)
        # 按钮
        self.Button0 = tk.Button(self.root, text="开始检测",command=self.btn0event)
        self.Button0.place(x=100, y=80, width=120, height=30)
        self.Button1 = tk.Button(self.root, text="退出", command=self.root.destroy)
        self.Button1.place(x=250, y=80, width=120, height=30)
        # 文本框
        self.w1 = ScrolledText(self.root, width=100, height=50) # 这是带滚动条的文本框
        self.w1.place(x=60, y=130,width=370, height=250)
        pass
    def btn0event(self):
        # btn0按钮事件
        info = self.Entry0.get()
        if info == '':
            messagebox.showerror("error","请输入要隐藏的文件！")
        else:
            self.w1.insert("end", "开始\n")
            self.T = threading.Thread(target=self.file_hide_recover,args=[info])  # 多线程
            self.T.setDaemon(True)  # 线程守护，即主进程结束后，此线程也结束。否则主进程结束子进程不结束
            self.T.start()  # 启动
    def file_hide_recover(self,info):
        print("info={}".format(info))
        flag_G = False  # 标志变量 False代表未处理  True 代表已处理
        while True:
            disk_name = self.find_disk_G()
            if disk_name == 'G:':  # 检测到U盘G
                if flag_G == False:  # 该U盘未处理
                    print("发现U盘,开始处理指定文件！")
                    self.w1.insert("end",get_time()+'发现U盘,开始处理指定文件！\n')
                    # 将指定文件隐藏/恢复
                    f = disk_name + '\\' + info
                    if os.path.exists(f):
                        file_flag = win32file.GetFileAttributesW(f)  # 获取该文件的属性
                        is_hiden = file_flag & win32con.FILE_ATTRIBUTE_HIDDEN  # 判断是否被隐藏
                        if is_hiden:
                            print("该文件已经处于隐藏状态")
                            self.w1.insert("end", get_time()+"该文件已经处于隐藏状态\n")
                            win32api.SetFileAttributes(f, win32con.FILE_ATTRIBUTE_NORMAL)
                            print("文件恢复完毕！")
                            self.w1.insert("end", get_time()+"文件恢复完毕！\n")
                            flag_G = True  # 标志该U盘处理完毕
                            time.sleep(2)
                        else:
                            print("该文件处于正常显示状态")
                            self.w1.insert("end", get_time()+"该文件处于正常显示状态\n")
                            win32api.SetFileAttributes(f, win32con.FILE_ATTRIBUTE_HIDDEN)
                            print("文件隐藏完毕！")
                            self.w1.insert("end", get_time() + "文件隐藏完毕！\n")
                            flag_G = True  # 标志该U盘处理完毕
                            time.sleep(2)
                    else:
                        print("该U盘中没有您指定的文件！")
                        self.w1.insert("end", get_time() + "该U盘中没有您指定的文件！\n")
                        flag_G = True
                        time.sleep(1)
                else:  # 该U盘已经处理过了
                    print("检测到U盘，但已经处理过了！")
                    self.w1.insert("end", get_time() + "检测到U盘，但已经处理过了！\n")
                    time.sleep(2)
            else:  # 未检测到U盘
                flag_G = False
    def find_disk_G(self):
        t = 2  # 检测间隔时间
        disk_name = ''  # U盘名字
        if os.path.exists('G:'):  # 指定U盘
            disk_name = 'G:'
        else:
            print("暂未发现U盘,{}秒后重新扫描！".format(t))
            self.w1.insert("end", get_time()+"暂未发现U盘,{}秒后重新扫描！\n".format(t))
            time.sleep(t)
        return disk_name

if __name__ == '__main__':
    a = GUI()
    a.root.mainloop()



